home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / WarpQuake / Src / worlda.s < prev    next >
Text File  |  2000-05-22  |  3KB  |  145 lines

  1. /*
  2. Copyright (C) 1996-1997 Id Software, Inc.
  3.  
  4. This program is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License
  6. as published by the Free Software Foundation; either version 2
  7. of the License, or (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  12.  
  13. See the GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. */
  20. //
  21. // worlda.s
  22. // x86 assembly-language server testing stuff
  23. //
  24.  
  25. #define GLQUAKE    1    // don't include unneeded defs
  26. #include "asm_i386.h"
  27. #include "quakeasm.h"
  28. #include "d_ifacea.h"
  29.  
  30. #if id386
  31.  
  32.     .data
  33.  
  34. Ltemp:    .long    0
  35.  
  36.     .text
  37.  
  38. //----------------------------------------------------------------------
  39. // hull-point test
  40. //----------------------------------------------------------------------
  41.  
  42. #define hull    4+8                // because only partially pushed
  43. #define    num        8+4                // because only partially pushed
  44. #define p        12+12            // because only partially pushed
  45.  
  46.     .align 4
  47. .globl C(SV_HullPointContents)
  48. C(SV_HullPointContents):
  49.     pushl    %edi                // preserve register variables
  50.     movl    num(%esp),%eax
  51.     testl    %eax,%eax
  52.     js        Lhquickout
  53.  
  54. //    float        d;
  55. //    dclipnode_t    *node;
  56. //    mplane_t    *plane;
  57.  
  58.     pushl    %ebx
  59.     movl    hull(%esp),%ebx
  60.  
  61.     pushl    %ebp
  62.     movl    p(%esp),%edx
  63.  
  64.     movl    hu_clipnodes(%ebx),%edi
  65.     movl    hu_planes(%ebx),%ebp
  66.  
  67.     subl    %ebx,%ebx
  68.     pushl    %esi
  69.  
  70. // %ebx: 0
  71. // %eax: num
  72. // %edx: p
  73. // %edi: hull->clipnodes
  74. // %ebp: hull->planes
  75.  
  76. //    while (num >= 0)
  77. //    {
  78.  
  79. Lhloop:
  80.  
  81. //        node = hull->clipnodes + num;
  82. //        plane = hull->planes + node->planenum;
  83. // !!! if the size of dclipnode_t changes, the scaling of %eax needs to be
  84. //     changed !!!
  85.     movl    nd_planenum(%edi,%eax,8),%ecx
  86.     movl    nd_children(%edi,%eax,8),%eax
  87.     movl    %eax,%esi
  88.     rorl    $16,%eax
  89.     leal    (%ecx,%ecx,4),%ecx
  90.  
  91. //        if (plane->type < 3)
  92. //            d = p[plane->type] - plane->dist;
  93.     movb    pl_type(%ebp,%ecx,4),%bl
  94.     cmpb    $3,%bl
  95.     jb        Lnodot
  96.  
  97. //        else
  98. //            d = DotProduct (plane->normal, p) - plane->dist;
  99.     flds    pl_normal(%ebp,%ecx,4)
  100.     fmuls    0(%edx)
  101.     flds    pl_normal+4(%ebp,%ecx,4)
  102.     fmuls    4(%edx)
  103.     flds    pl_normal+8(%ebp,%ecx,4)
  104.     fmuls    8(%edx)
  105.     fxch    %st(1)
  106.     faddp    %st(0),%st(2)
  107.     faddp    %st(0),%st(1)
  108.     fsubs    pl_dist(%ebp,%ecx,4)
  109.     jmp        Lsub
  110.  
  111. Lnodot:
  112.     flds    pl_dist(%ebp,%ecx,4)
  113.     fsubrs    (%edx,%ebx,4)
  114.  
  115. Lsub:
  116.     sarl    $16,%eax
  117.     sarl    $16,%esi
  118.  
  119. //        if (d < 0)
  120. //            num = node->children[1];
  121. //        else
  122. //            num = node->children[0];
  123.     fstps    Ltemp
  124.     movl    Ltemp,%ecx
  125.     sarl    $31,%ecx
  126.     andl    %ecx,%esi
  127.     xorl    $0xFFFFFFFF,%ecx
  128.     andl    %ecx,%eax
  129.     orl        %esi,%eax
  130.     jns        Lhloop
  131.  
  132. //    return num;
  133. Lhdone:
  134.     popl    %esi
  135.     popl    %ebp
  136.     popl    %ebx                // restore register variables
  137.  
  138. Lhquickout:
  139.     popl    %edi
  140.  
  141.     ret
  142.  
  143. #endif    // id386
  144.  
  145.